package com.cobra.rdd.operator.transform

import org.apache.spark.{SparkConf, SparkContext}
//求相同key的平均值
object Spark25_RDD_Operator_Transform_aggregateByKeyTest {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Spark25_RDD_Operator_Transform_aggregateByKeyTest")
    val sc = new SparkContext(sparkConf)
   val rdd = sc.makeRDD(List(
     ("a",1),("a",2),("b",3),
     ("b",4),("b",5),("a",6)
   ),2)
    //aggregateByKey存在函数的柯里化，有两个参数列表
    //第一个参数列表
    //   需要传递一个参数，表示为初始值，主要用于当碰见第一个key的时候，和value进行分区计算
    //第二个参数列表需要传递两个参数
    //      第一个参数表示分区内计算规则
    //      第二个参数表示分区间计算规则
    val newRDD = rdd.aggregateByKey((0, 0))(
      //第一个t就是zeroValue的类型
      (t, v) => {
        (t._1 + v, t._2 + 1)
      },
      (t1, t2) => {
        (t1._1 + t2._1, t1._2  + t2._2)
      }
    )
    val resultRDD = newRDD.mapValues {
      case (num, count) => num / count
    }
    resultRDD.collect().foreach(println)
   // rdd.aggregateByKey(0)(_+_,_+_).collect().foreach(println)
    sc.stop()
  }
}
